package br.com.senacrs.control;

import br.com.senacrs.dao.DaoFactory;
import br.com.senacrs.dao.UsuarioDao;
import br.com.senacrs.model.UsuarioEN;
import br.com.senacrs.validation.UsuarioVal;
import java.util.List;

public class UsuarioCR implements ControlCR<UsuarioEN> {

    private UsuarioDao dao;
    private UsuarioVal validation;
    
    public UsuarioCR() {
        this.dao = new DaoFactory().getUsuarioDao();
        this.validation = new UsuarioVal();
    }
    
    @Override
    public void insert(UsuarioEN objeto) {
        this.validation.validateInsert(objeto);
        this.dao.insert(objeto);
    }

    @Override
    public void delete(UsuarioEN objeto) {
        this.validation.validateDelete(objeto);
        this.dao.delete(objeto);
    }

    @Override
    public void update(UsuarioEN objeto) {
        this.validation.validateUpdate(objeto);
        this.dao.update(objeto);
    }

    @Override
    public List<UsuarioEN> selectAll() {
       this.validation.validateSelectAll();
       return this.dao.selectAll();
    }

    @Override
    public List<UsuarioEN> selectAllOrderBy(String order) {
        this.validation.validateSelectAllOrderBy(order);
        return this.dao.selectAllOrderBy(order);
    }

    @Override
    public UsuarioEN selectOne(Long id) {
        this.validation.validateSelectOne(id);
        return (UsuarioEN) this.dao.selectOne(id);
    }

    @Override
    public UsuarioEN selectOneGet(Long id) {
        this.validation.validateSelectOneGet(id);
        return (UsuarioEN) this.dao.selectOneGet(id);
    }

    @Override
    public List<UsuarioEN> selectWhere(String criterio, String string) {
        this.validation.validateSelectWhere(criterio, string);
        return this.dao.selectWhere(criterio, string);
    }

    @Override
    public List<UsuarioEN> selectWhere(String criterio, Long valor) {
        this.validation.validateSelectWhere(criterio, valor);
        return this.dao.selectWhere(criterio, valor);
    }

    @Override
    public List<UsuarioEN> selectWhere(String criterio, String criterioJoin, Long valor) {
        this.validation.validateSelectWhere(criterio, criterioJoin, valor);
        return this.dao.selectWhere(criterio, criterioJoin, valor);
    }  
    /**
     * Obtem usuario a partir de seu login e senha, retorna null caso não exista
     * @param usuario
     * @return usuario
    */
    public UsuarioEN logar(UsuarioEN usuario){
        return this.dao.logar(usuario);
    }
    /**
     * Verifica se o usuario possui permissão ao arquivo informado
     * @param usuarioEN Usuario com o nome setado
     * @param rules Arquivo que usuario quer acessar
     * @return true se o usuario possui acesso
     */
    public boolean hasRules(UsuarioEN usuarioEN, String arquivo) {
        this.validation.validateHasRules(usuarioEN, arquivo);
        //Obtem usuario pelo nome
        List<UsuarioEN> usuarios = this.selectWhere("nome", usuarioEN.getNome());
        if(usuarios != null && !usuarios.isEmpty()){
            usuarioEN = usuarios.get(0);
        } else {
            return false;
        }
        //se o usuario é administrador tem acesso a todos os arquivos
        if (usuarioEN.isAdm()){
            return true;
        }else{
            //TODO Definir regras de acesso aqui para segundo projeto
            return false;
        }
    }
}
